﻿using UnityEngine;
using System.IO;
using System.Text;
using UnityEngine.UI;
using System.Collections;
using System.Collections.Generic;

public class PixelReader : MonoBehaviour
{
    public Texture2D sourceImage; // 在Inspector中拖入要分析的纹理
    //public RawImage previewImage; // 用于显示预览
    //public Text progressText;     // 显示进度信息
    //public Text resultText;       // 显示转换结果摘要

    private string desktopPath;

    void Start()
    {
        // 获取桌面路径
        desktopPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Desktop);
        //Debug.Log("桌面路径: " + desktopPath);

        //// 显示桌面路径
        //if (progressText != null)
        //{
        //    progressText.text = $"结果将保存到桌面: {desktopPath}";
        //}
        ConvertImageToText();
    }

    // 公共方法：从UI按钮调用
    public void ConvertImageToText()
    {
        //return;
        if (sourceImage == null)
        {
            Debug.LogError("请选择一张图片");
            return;
        }

        StartCoroutine(ProcessImage());
    }

    Dictionary<int, char> level_Dir = new Dictionary<int,char>();
    List<int> level_list=new List<int>();
    string[] shape = new string[] { "五边型", "八边型", "砖石" };


    IEnumerator ProcessImage()
    {
        //// 显示预览图
        //if (previewImage != null)
        //{
        //    previewImage.texture = sourceImage;
        //    previewImage.SetNativeSize();
        //}

        // 确保纹理可读
        if (!sourceImage.isReadable)
        {
            Debug.LogError("纹理不可读！请在导入设置中启用'Read/Write Enabled'");
            yield break;
        }

        int width = sourceImage.width;
        int height = sourceImage.height;

        // 更新进度
        UpdateProgress($"开始处理图片: {width}×{height}像素");
        yield return null;

        // 创建字符串构建器
        StringBuilder sb = new StringBuilder();

        // 创建颜色映射表
        Dictionary<char, Color> colorMap = new Dictionary<char, Color>();

        // 添加文件头信息
        sb.AppendLine($"图片尺寸: {width}×{height}");
        sb.AppendLine();

        // 处理每个像素
        int totalPixels = width * height;
        int processedPixels = 0;

        for (int y = height - 1; y >= 0; y--)
        {
            for (int x = 0; x < width; x++)
            {
                 int index = y * width + x;
                // 获取像素颜色
                Color pixelColor = sourceImage.GetPixel(x, y);

                // 提取红色分量并转换为0-255范围
                int redValue = Mathf.RoundToInt(pixelColor.r * 255);

                // 转换为字符
                char pixelChar = ConvertColorToChar(redValue);

                // 记录字母对应的颜色
                if (!colorMap.ContainsKey(pixelChar))
                {
                    colorMap.Add(pixelChar, pixelColor);
                }

                //sb.Append(pixelChar);
                level_list.Add(pixelChar);

              
                // 更新进度
                processedPixels++;
                if (processedPixels % 1000 == 0)
                {
                    float progress = (float)processedPixels / totalPixels * 100;
                    UpdateProgress($"处理中: {progress:F1}%");
                    yield return null; 
                }
            }
        }

        int num = 0;
        for(int i=0;i < level_list.Count;i++)
        {
            if(!level_Dir.ContainsKey(level_list[i]))
            {
                num++;
                if (num < 10)
                {
                    level_Dir.Add(level_list[i], (char)('0' + num)); 
                }
                else if (num == 10)
                {
                    level_Dir.Add(level_list[i], '0');
                }
                else
                if(num>36)
                {
                    level_Dir.Add(level_list[i], (char)('a' + (num - 37)));
                }
                else
                {
                    level_Dir.Add(level_list[i], (char)('A' + (num - 11)));
                }
            }
        }


        //for (int y = height - 1; y >= 0; y--)
        for(int y=0;y<=height-1;y++)
        {
            for (int x = 0; x < width; x++)
            {
                if(y==0&&x==0)
                {
                    sb.Append(sourceImage.name+",");
                }

                int index = y * width + x;
                sb.Append(level_Dir[level_list[index]]);
                // 每行结束换行
                if (x == width - 1)
                {
                    sb.AppendLine();
                }
                else
                {
                    sb.Append('.');  // 添加句点
                }
            }
        }




                // 添加颜色映射表
        sb.AppendLine("\n=== 字母颜色映射表 ===");
        int num1 = 0;
        foreach (var pair in colorMap)
        {
            if(num1==0)
            {
                sb.Append(sourceImage.name+"|");
            }

            int r = Mathf.RoundToInt(pair.Value.r * 255);
            int g = Mathf.RoundToInt(pair.Value.g * 255);
            int b = Mathf.RoundToInt(pair.Value.b * 255);
            int _num = Random.Range(0, 3);
            sb.Append($"{level_Dir[pair.Key]},{r},{g},{b},{shape[_num]}|");
            num1++;
        }

        // 保存结果
        SaveToDesktop(sb.ToString(), width, height);

        // 显示摘要
        UpdateProgress("转换完成！");

        //if (resultText != null)
        //{
        //    resultText.text = $"转换完成！\n" +
        //                     $"图片尺寸: {width}×{height}\n" +
        //                     $"字母数量: {colorMap.Count}\n" +
        //                     $"保存到: {desktopPath}/pixel_conversion.txt";
        //}
    }

    // 颜色值转字符（使用红色通道）
    private char ConvertColorToChar(int redValue)
    {
        // 确保结果在0-35范围内（0-9 + A-Z）
        int charIndex = redValue % 36;

        if (charIndex <= 9)
        {
            // 数字0-9
            return (char)('0' + charIndex);
        }
        else
        {
            // 字母A-Z（对应10-35）
            return (char)('A' + charIndex - 10);
        }
    }

    // 更新进度显示
    private void UpdateProgress(string message)
    {
        //Debug.Log(message);
        //if (progressText != null)
        //{
        //    progressText.text = message;
        //}
    }

    // 保存结果到桌面
    private void SaveToDesktop(string content, int width, int height)
    {
        string fileName = sourceImage.name+".txt";//$"pixel_conversion_{width}x{height}_{System.DateTime.Now:yyyyMMdd_HHmmss}.txt";
        string targetFolderPath = Path.Combine(desktopPath, "111");
        string filePath = Path.Combine(targetFolderPath, fileName);

        File.WriteAllText(filePath, content);
        Debug.Log($"文件已保存到: {filePath}");
    }
}

